﻿using System;
using MySql.Data.MySqlClient;
using System.Collections;
using System.Windows.Forms;

namespace TransporteAgua
{
    public partial class frmClientes : Form
    {
        Database datos;
        string[] llavesCliente, clientes;
        int key;
        bool agregando, modificando;
        TabPage saveFiltro;
        frmPrincipal parent;

        public frmClientes(Database db, frmPrincipal dad)
        {
            InitializeComponent();
            datos = db;
            saveFiltro = grpFiltros;
            lstClientes.Items.Clear();
            cmbOrden.SelectedIndex = 1;
            mostrando();
            parent = dad as frmPrincipal;
        }
        private void obtenerListaClientes()
        {
            string filtro = generarFiltro();
            try
            {
                int numResultados = datos.contar("clientes", filtro);
                llavesCliente = datos.getColumn("id", "clientes", filtro, cmbOrden.Text, numResultados);
                clientes = datos.getColumn("nombre", "clientes", filtro, cmbOrden.Text, numResultados);
                lstClientes.Items.Clear();
                foreach (string cl in clientes)
                    lstClientes.Items.Add(cl);
            }
            catch (MySqlException e)
            {
                MessageBox.Show(e.Message, "Error de base de datos!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private string generarFiltro()
        {
            string filtroID="",filtroNombre="", filtroDomicilio="", filtroTelefono="";
			if (chkFId.Checked) filtroID = txtFiltroId.Text;
            if (chkFNombre.Checked) filtroNombre = txtFiltroNombre.Text;
            if (chkFDomicilio.Checked) filtroDomicilio = txtFiltroDomicilio.Text;
            if (chkFTelefono.Checked) filtroTelefono = txtFiltroTelefono.Text;
            return "WHERE id LIKE '"+filtroID+"%' AND(nombre LIKE '%" + filtroNombre + "%' OR contacto LIKE '%"+filtroNombre+"%') AND (direccionF LIKE '%" + filtroDomicilio + "%' OR direccionE LIKE '%" + filtroDomicilio + "%') AND telefono LIKE '%"+filtroTelefono+"%' ";
        }
		private void apagarFiltros() {
			chkFId.Checked = chkFNombre.Checked = chkFTelefono.Checked = chkFDomicilio.Checked = false;
		}
        private void frmClientes_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            btnSeleccionar.Visible = false;
			apagarFiltros();
            Hide();
        }
        public void activarSeleccionar()
        {
            btnSeleccionar.Visible = true;
        }
        private void agregar()
        {
            btnAgregar.Enabled = btnModificar.Enabled = btnEliminar.Enabled = false;
            btnAceptar.Visible = btnCancelar.Visible = true;
            readOnlyTextBox(false);
            if (tabControl.TabCount == 2) tabControl.TabPages.RemoveAt(1);
            agregando = true;
        }
        private void mostrando()
        {
            btnAgregar.Enabled = btnModificar.Enabled = btnEliminar.Enabled = true;
            btnAceptar.Visible = btnCancelar.Visible = false;
            readOnlyTextBox(true);
            if (tabControl.TabCount == 1) tabControl.TabPages.Add(saveFiltro);            
        }
        private void modifica()
        {
            btnAgregar.Enabled = btnModificar.Enabled = btnEliminar.Enabled = false;
            btnAceptar.Visible = btnCancelar.Visible = true;
            readOnlyTextBox(false);
            if (tabControl.TabCount == 2) tabControl.TabPages.RemoveAt(1);            
            modificando = true;
        }
        private void readOnlyTextBox(bool valor) {
			txtNombre.ReadOnly = txtTelefono.ReadOnly = txtContacto.ReadOnly = valor;
			txtDireccionE.ReadOnly = txtCrucesE.ReadOnly = txtColoniaE.ReadOnly = txtSectorE.ReadOnly = txtCPE.ReadOnly = valor;
			txtDireccionF.ReadOnly = txtSectorF.ReadOnly = txtEstadoF.ReadOnly = txtMunicipioF.ReadOnly = txtCPF.ReadOnly = txtRFC.ReadOnly = valor;
			txtPrecioC.ReadOnly = txtPrecioM.ReadOnly = txtPrecioG.ReadOnly = txtPrecioL.ReadOnly = txtObservaciones.ReadOnly = valor;
			txtSaldo.ReadOnly = true; // no se puede modificar saldo
        }
        private void btnAgregar_Click(object sender, EventArgs e)
        {
            key = lstClientes.SelectedIndex;
            agregar();
            foreach (Control c in grpFacturacion.Controls)
                if (c is TextBox) c.Text = "";
            lstClientes.SelectedIndex = -1;
            txtID.Text = "Asignado automaticamente...";
        }
        private void btnModificar_Click(object sender, EventArgs e)
        {
            if (lstClientes.SelectedIndex < 0) MessageBox.Show("Debes seleccionar un operador", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            else
            {
                key = lstClientes.SelectedIndex;
                modifica();
            }
        }
        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (lstClientes.SelectedIndex < 0) MessageBox.Show("Debes seleccionar un operador", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            else
            {
                string name = txtNombre.Text;
                DialogResult res = MessageBox.Show("Estas a punto de eliminar a " + name + " de la base de datos.\n¿Estas seguro que deseas hacerlo?", "Eliminar", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
                if (res == DialogResult.Yes)
                {
                    datos.eliminar("clientes", txtID.Text);
                    obtenerListaClientes();
                    if (lstClientes.Items.Count > 0) lstClientes.SelectedIndex = 0;
                    MessageBox.Show("El cliente " + name + " se ha eliminado", "Base de datos", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            string[] campos = { "nombre", "RFC", "direccionF", "sectorF", "estadoF","municipioF", "CPF", 
                                "direccionE", "sectorE","crucesE", "CPE","coloniaE",  
                                "Pgrande", "Pmediano", "Pchico", "litro", 
                                "saldo", "observaciones","contacto","telefono" };
            string[] valores = { txtNombre.Text, txtRFC.Text, txtDireccionF.Text, txtSectorF.Text,txtEstadoF.Text,txtMunicipioF.Text,txtCPF.Text,
                                 txtDireccionE.Text,txtSectorE.Text,txtCrucesE.Text,txtCPE.Text,txtColoniaE.Text,
                                 txtPrecioG.Text, txtPrecioM.Text, txtPrecioC.Text, txtPrecioL.Text,
                                 txtSaldo.Text, txtObservaciones.Text,txtContacto.Text,txtTelefono.Text};
            try
            {
                if (agregando)
                {
                    string newid = datos.agregar("clientes", campos, valores);
                    obtenerListaClientes();
                    mostrando();
                    for (int i = 0; i < llavesCliente.Length; i++)
                        if (llavesCliente[i].Equals(newid))
                        {
                            lstClientes.SelectedIndex = i;
                            break;
                        }
                    MessageBox.Show("Cliente agregado!", "Base de datos", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    agregando = false;
                }
                else if (modificando)
                {
                    string key = llavesCliente[lstClientes.SelectedIndex];
                    datos.modificar("clientes", key, campos, valores);


                    /* Modificar pedidos anteriores */
                    string [] campos2 = { "cliente", "telefono", "contacto","direccionE"};
                    string [] valores2 = { txtNombre.Text,txtTelefono.Text,txtContacto.Text,txtDireccionE.Text};
                    int pedidosAModificar = datos.contar("pedidos","WHERE idcliente='"+key+"'");
					string[] PedidosAModificar = datos.getColumn("id", "pedidos", "WHERE idcliente='" + key + "'", "id", pedidosAModificar);
                    foreach(string pedido in PedidosAModificar)
                        datos.modificar("pedidos", pedido, campos2, valores2);

                    
                    obtenerListaClientes();
                    mostrando();
                    for (int i = 0; i < llavesCliente.Length; i++)
                        if (llavesCliente[i].Equals(key))
                        {
                            lstClientes.SelectedIndex = i;
                            break;
                        }
                    MessageBox.Show("Cliente modificado!", "Base de datos", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    modificando = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error de base de datos!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            mostrando();
            chkFNombre.Checked = chkFDomicilio.Checked = chkFTelefono.Checked = false;
            lstClientes.SelectedIndex = key;
            agregando = false;
            modificando = false;
        }
        private void llenarCampos(string[] datos)
        {
            txtID.Text = datos[0];
            txtNombre.Text = datos[1];
            txtDireccionF.Text = datos[2];
            txtMunicipioF.Text = datos[3];
            txtSectorF.Text = datos[4];
            txtEstadoF.Text = datos[5];
            txtRFC.Text = datos[6];
            txtPrecioG.Text = datos[7];
            txtPrecioM.Text = datos[8];
            txtPrecioC.Text = datos[9];
            txtPrecioL.Text = datos[10];
            txtSaldo.Text = datos[11];
            txtObservaciones.Text = datos[12];
            txtDireccionE.Text = datos[13];
            txtCrucesE.Text = datos[14];
            txtColoniaE.Text = datos[15];
            txtSectorE.Text = datos[16];
            txtCPE.Text = datos[17];
            txtCPF.Text = datos[18];
            txtContacto.Text = datos[19];
            txtTelefono.Text = datos[20];
        }

        private void chkNombre_CheckedChanged(object sender, EventArgs e)
        {
            txtFiltroNombre.Enabled = chkFNombre.Checked;
            obtenerListaClientes();
        }

        private void chkDomicilio_CheckedChanged(object sender, EventArgs e)
        {
            txtFiltroDomicilio.Enabled = chkFDomicilio.Checked;
            obtenerListaClientes();
        }

        private void chkTelefono_CheckedChanged(object sender, EventArgs e)
        {
            txtFiltroTelefono.Enabled = chkFTelefono.Checked;
            obtenerListaClientes();
        }

        private void txtFiltroNombre_TextChanged(object sender, EventArgs e)
        {
            obtenerListaClientes();
        }

        private void txtFiltroDomicilio_TextChanged(object sender, EventArgs e)
        {
            obtenerListaClientes();
        }

        private void txtFiltroTelefono_TextChanged(object sender, EventArgs e)
        {
            obtenerListaClientes();
        }

        private void lstClientes_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstClientes.SelectedIndex >= 0)
                llenarCampos(datos.getRow(llavesCliente[lstClientes.SelectedIndex], "clientes"));
            tabControl.SelectedIndex = 0;
        }

        private void cmbOrden_SelectedIndexChanged(object sender, EventArgs e)
        {
            obtenerListaClientes();
        }

        private void btnSeleccionar_Click(object sender, EventArgs e)
        {
            string [] datos = {txtID.Text,txtNombre.Text,txtContacto.Text, txtTelefono.Text, txtDireccionE.Text,txtCrucesE.Text,txtColoniaE.Text,txtSectorE.Text,txtCPE.Text};
            parent.tomarPedido.llenarCliente(datos);
            btnSeleccionar.Visible = false;
            Hide();
        }

		private void chkId_CheckedChanged(object sender, EventArgs e)
		{
			txtFiltroId.Enabled = chkFId.Checked;
			obtenerListaClientes();
		}

		private void txtFiltroId_TextChanged(object sender, EventArgs e)
		{
			obtenerListaClientes();
		}
		public void mostrarCliente(string id) {
			chkFId.Checked = true;
			txtFiltroId.Text = id;			
			lstClientes.SelectedIndex = 0;
		}
    }
}
